package com.tian.view.anim.attr_anim

import android.animation.Animator
import android.animation.Keyframe
import android.animation.ObjectAnimator
import android.animation.PropertyValuesHolder
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.BounceInterpolator
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.tian.view.databinding.ControlViewListBinding

/**
 * @author tiansongtao, Email:tiansongtao@up366.com
 * @date 2022/12/29 11:14
 *
 * 属性动画ObjectAnimator进阶
 */
class ObjectAnimatorAdvanceFragment : Fragment() {

    private lateinit var b: ControlViewListBinding


    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        b = ControlViewListBinding.inflate(inflater)
        return b.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        (requireActivity() as AppCompatActivity).supportActionBar?.title = "ObjectAnimator进阶"
        initPropertyValuesHolder()
        initKeyframe()
        initViewPropertyAnimator()
    }

    /**
     *
     * ObjectAnimator.ofPropertyValuesHolder 用来使用 PropertyValuesHolder来创建动画。
     *
     * ObjectAnimator 中 PropertyValuesHolder是用来保存动画过程中需要使用的属性和变量
     * 我们前面使用的 ObjectAnimator.ofInt\ofFloat，其实都是调用了PropertyValuesHolder来
     * 保存我们设置的属性与变量，这里我们可以直接手动自己创建PropertyValuesHolder设置给ObjectAnimator.
     *
     * ObjectAnimator创建都是调用了 PropertyValuesHolder，所以PropertyValuesHolder也是有与
     * ObjectAnimator中相同的函数 eg:ofFloat ofInt
     */
    private fun initPropertyValuesHolder() {
        b.mbt1.text = "PropertyValuesHolder"
        b.mbt1.visibility = View.VISIBLE
        b.mbt1.setOnClickListener {
            val holder = PropertyValuesHolder.ofFloat("rotation", 90f, -90f, 90f, -90f)
            val holder1 = PropertyValuesHolder.ofFloat("translationX", 0f, 300f)
            // 使用 ObjectAnimator.ofPropertyValuesHolder 来创建
            ObjectAnimator.ofPropertyValuesHolder(b.mbtShow, holder, holder1).setDuration(3000).start()
        }
    }

    /**
     * KeyFrame 翻译过来就是关键帧，他可以定义在动画的进度中，关键帧的参数
     * keyframe.ofXX(fraction, value):
     *    fraction: 动画进度，就是我们前面了解的插值器计算的进度。
     *    value: 确定当前进度动画的值。
     *
     * 创建了keyframe后，我们使用 PropertyValuesHolder.ofKeyframe来创建 holder,如上面函数
     *
     */
    private fun initKeyframe() {
        b.mbt2.text = "KeyFrame"
        b.mbt2.visibility = View.VISIBLE
        b.mbt2.setOnClickListener {
            // 进度为0时，动画值为 0
            val keyframe = Keyframe.ofFloat(0f, 0f)
            // 进度为0.1时，动画值为 -90f
            val keyframe1 = Keyframe.ofFloat(0.2f, -90f)
            // 每一关键帧都可设置 Interpolator，这个表示从 keyframe到keyframe1使用这个插值器
            keyframe1.interpolator = BounceInterpolator()
            // 进度为01时，动画值为0f
            val keyframe2 = Keyframe.ofFloat(1f, 0f)
            // 将关键帧与旋转动画rotation 构建一个 PropertyValuesHolder
            val holder = PropertyValuesHolder.ofKeyframe("rotation", keyframe, keyframe1, keyframe2)
            //  使用PropertyValuesHolder创建ObjectAnimator并运行
            ObjectAnimator.ofPropertyValuesHolder(b.mbtShow, holder).setDuration(3000).start()

        }
    }

    /**
     * 直接翻译就是 view 属性的动画，
     * View提供了[View.animate] 函数来可以直接创建动画
     *
     * 提供了很多函数来设置不同的动画
     * alpha、scaleX\Y、 translationX\Y、rotationX\Y、等常用的
     * alphaBy、scaleX\YBy、 translationX\YBy、rotationX\YBy、等带有By的是设置增量，
     *      eg: View.alphaBy(x) = view.setAlpha(view.getAlpah() + x)
     * 还有
     * x() y() : 相对于父控件左上角最终坐标。
     * xBy() yBy():  相对于父控件左上角坐标的增量。
     */
    private fun initViewPropertyAnimator() {
        b.mbt3.text = "ViewPropertyAnimator"
        b.mbt3.visibility = View.VISIBLE
        b.mbt3.setOnClickListener {
            b.mbtShow.animate().setDuration(3000).alpha(0.2f).setListener(object : Animator.AnimatorListener {
                override fun onAnimationStart(animation: Animator?) {

                }

                override fun onAnimationEnd(animation: Animator?) {

                }

                override fun onAnimationCancel(animation: Animator?) {
                }

                override fun onAnimationRepeat(animation: Animator?) {
                }
            })
        }
    }

}